var LayoutManager={
	/**
	 * 可视对象排列
	 * xNum在x轴上排列的数量
	 * xDis,yDis,在x轴与y轴上的间距
	 * x,y初始位置
	 * sign正1从左向右从上向下排当sign为负1时则反过来,,*/
	displayRank:(array,xNum=1,xDis=0,yDis=0,x=0,y=0,sign=1)=>
	{
		for(let i=0;i<array.length;i++){
			let display=array[i];
			display.x=x+Math.floor(i%xNum)*(display.width+xDis)*sign;
			display.y=y+Math.floor(i/xNum)*(display.height+yDis)*sign;
		}
	},
	/**
	 * 分部的可视对象排列
	 * array视对象数组
	 * part1,part2：[len,xNum,xDis,yDis,x,y],参看方求displayRank的参数
	 * sign正1从左向右从上向下排当sign为负1时则反过来
	 * part1[0]+part2[0]==array.length;//如果为false,会有问题
	 * */
	displayRankPart:(array,part1,part2=null,sign=1)=>
	{
		let len1,len2,xNum,xDis,yDis,x,y;
		len1=part1[0];xNum=part1[1];xDis=part1[2];yDis=part1[3];x=part1[4];y=part1[5];
		let arr1=array.slice(0,len1);
		LayoutManager.displayRank(arr1,xNum,xDis,yDis,x,y,sign);
		if(part2){
			len2=part2[0];xNum=part2[1];xDis=part2[2];yDis=part2[3];x=part2[4];y=part2[5];
			let arr2=array.slice(len1,len1+len2);
			LayoutManager.displayRank(arr2,xNum,xDis,yDis,x,y,sign);
		}
	},
	/**
	 * 圆形,扇形,椭圆形
	 * 按顺时针环绕圆形/扇形/椭圆形的排列布局
	 * center中心位置
	 * radius半径距离
	 * loop环形排列为2*Math.PI,如果值是Math.PI/2是90度的扇形
	 * skewR偏离的弧度（90度=Math.PI/2弧度）
	 * skewX偏离的X轴位置
	 * skewY偏离的Y轴位置
	 * skewXR在X轴上半径增加的值（椭圆布局）
	 * skewYR在Y轴上半径增加的值（椭圆布局）
	 * */
	displayCircle:(array,centerX,centerY,radius,loop=2*Math.PI,skewR=0,skewX=0,skewY=0,skewXR=0,skewYR=0)=>
	{
		let count=array.length;
		let radian=loop/count
		if(loop<2*Math.PI){//如果是扇形的必须把个数减少一个再相除
			radian=loop/(count-1)
		}
		for(let i=0;i<count;i++){
			let display=array[i];
			display.x=centerX+Math.cos(radian*i-skewR)*(radius+skewXR)+skewX;
			display.y=centerY+Math.sin(radian*i-skewR)*(radius+skewYR)+skewY;
		}
	},
	/**
	 * 多边形
	 * 按顺时针环绕多边形的排列布局
	 * center中心位置
	 * radius半径距离
	 * size边数
	 * skewR偏离的弧度（90度=Math.PI/2弧度）
	 * */
	displayPolygon:(array,centerX,centerY,radius=100,size=5,skewR=0)=>
	{
		if(size<3||size>array.length){
			console.log("多边形的边数不正确")
			return;
		}
		let count=array.length;
		let radian=2*Math.PI/size;//每个边的弧度
		let num=Math.floor(count/size);//每个边的个数
		let [cnt,display]=[0,null];
		for (let i=0;i<size;i++) {
			let x1=centerX + Math.cos(i*radian-skewR)*radius;
			let y1=centerY + Math.sin(i*radian-skewR)*radius;
			let j=i+1;
			j=j==size?0:j;
			let x2=centerX + Math.cos(j*radian-skewR)*radius;
			let y2=centerY + Math.sin(j*radian-skewR)*radius;
			for(let k=0;k<num;k++){
				let m=k+num*i;
				cnt++;
				if(m<count){
					display=array[m];
					display.x=x1;
					display.y=y1;
					display.x+=(x2-x1)/num*k;
					display.y+=(y2-y1)/num*k;
				}
			}
		}
		console.log(cnt,array.length)
		for(let i=cnt;i<array.length;i++){
			let d=array[i];
			d.x=display.x;d.y=display.y;
		}
	},
	/**
	 * 三角形(1,2,3,4)每层多1个
	 * xDis,yDis,在x轴与y轴上的间距
	 * x,y初始位置
	 * sign正1从左向右从上向下排当sign为负1时则反过来
	 * isCenter是等腰三角形，为false时是直角三角形
	 * */
	displayTrigon:(array,xDis=0,yDis=0,x=0,y=0,sign=1,isCenter=true)=>
	{
		let start=0;
		let len=1
		let index=1;
		let temps=array.slice(start,len);
		let display=array[0];
		rank();
		function rank(){
			let cx=0;
			let tempLen=temps.length
			if(tempLen>1&&isCenter){
				cx=(tempLen-1)*(display.width+xDis)/-2*sign;
			}
			for(let i=0;i<tempLen;i++){
				display=temps[i];
				display.x=x+i*(display.width+xDis)*sign+cx;
				display.y=y+(index-1)*(display.height+yDis)*sign;
			}
			index++;
			start=len;
			len=start+index;
			temps=array.slice(start,len);
			if(len<=array.length+start){
				rank();
			}
		}
	},
	/**
	 * 三角形2(1,3,5,7)每层多两个
	 * xDis,yDis,在x轴与y轴上的间距
	 * x,y初始位置
	 * sign正1从左向右从上向下排当sign为负1时则反过来
	 * isCenter是等腰三角形，为false时是直角三角形
	 * */
	 displayTrigon2:(array,x=0,y=0)=>
	 {
		let start=0;
		let len=1
		let index=1;
		let temps=array.slice(start,len);
		let display=array[0];
		rank();
		function rank(){
			let cx=0;
			let tempLen=temps.length;
			if(tempLen>1){
				cx=(tempLen-1)*(display.width)/-2;
			}
			for(let i=0;i<tempLen;i++){
				display=temps[i];
				display.x=x+i*(display.width)+cx;
				display.y=y+(index-1)*(display.height/2);
			}
			index+=2;
			start=len;
			len=start+index;
			temps=array.slice(start,len);
			if(len<=array.length+start){
				rank();
			}
		}
	 },
	 /**
	 * 菱形
	 * 按顺时针环绕多边形的排列布局
	 * center中心位置
	 * */
	 displayRhomb:(array,x=0,y=0)=>
	 {
		let start=0;
		let len=1
		let index=1;
		let cnt=0;
		let temps=array.slice(start,len);
		let display=array[0];
		let length=array.length;
		rank();
		function rank(){
			let cx=0;
			let tempLen=temps.length;
			if(tempLen>1){
				cx=(tempLen-1)*(display.width)/-2;
			}
			for(let i=0;i<tempLen;i++){
				display=temps[i];
				display.x=x+i*(display.width)+cx;
				display.y=y+(index-1)*(display.height/2);
			}
			start=len;
			index+=2;
			if(start<length/2){
				len=start+index;
				cnt=index;
			}else{
				cnt-=2;
				len=start+cnt;
			}
			//console.log(cnt)
			temps=array.slice(start,len);
			if(cnt>0&&len<=length+start){
				rank();
			}
		}
    },
	/**
	 * 墙形
	 * 可视对象砖块（墙）排列
	 * xNum在x轴上排列的数量
	 * xDis,yDis,在x轴与y轴上的间距
	 * x,y初始位置
	 * offX偏移的距离,*/
	displayWall:(array,xNum=1,xDis=0,yDis=0,x=0,y=0,offX=10)=>
	{
		for(let i=0;i<array.length;i++){
			let xx=Math.floor(i/xNum)%2==0?offX:0;
			let display=array[i];
			display.x=x+Math.floor(i%xNum)*(display.width+xDis)+xx;
			display.y=y+Math.floor(i/xNum)*(display.height+yDis);
		}
	},
	/**面积不相等的块在X轴的排列 */
	displayRankX:(array,xDis=0,x=0,y=0)=>
	{
		let [count,prevx]=[array.length,x];
		for(let i=0;i<count;i++){
			let display=array[i]
			let width=display.width;
			display.y=y
			display.x=prevx;
			prevx=display.x+(width+xDis);
		}
	},
	/**
	 * X形,必须是偶数，最理想的是4的倍数
	 * 如果是单数会有一个没有排上，如果是2的倍数不是4的倍数，会有一个重叠排在一起
	 * */
	displayX:(array,x=0,y=0)=>
	{
		let len=Math.floor(array.length/2);
		for(let i=0;i<len;i++){
			let display=array[i];
			display.x=x+i*(display.width);
			display.y=y+i*(display.height);
			display=array[len+i];
			display.x=x+(len-i-1)*(display.width);
			display.y=y+i*(display.height);
		}
	},
	/**
	 * 十字形,必须是偶数
	 * 如果是单数会有一个没有排上
	 * 如果横竖是单数会有一个压在下面
	 * 如果横竖是偶数会有两个被各压住一半
	 * */
	displayTen:(array,x=0,y=0)=>
	{
		let len=Math.floor(array.length/2)
		let half=Math.floor(len/2);
		if(len%2==0) half-=0.5;
		for(let i=0;i<len;i++){
			let display=array[i];
			display.x=x+half*(display.width);
			display.y=y+i*(display.height);
			display=array[len+i];
			display.x=x+i*(display.width);
			display.y=y+half*(display.height);
		}
	},
	/**
	 * 方蛇形,相当于蚊香按方形排列
	 */
	displaySnake:(array,x=0,y=0)=>
	{
		let len=array.length;
		let current=1;
		let total=1;
		let signs=[[1,0],[0,1],[-1,0],[0,-1]];
		let sInd=0;
		let display=array[0];
		display.x=x;display.y=y;
		rank();
		function rank(){
			let sign=signs[sInd];
			let [sx,sy]=[array[current-1].x,array[current-1].y];
			let j=0;
			for(let i=0;i<total;i++){
				j=current+i;
				if(j<len){
					let display=array[j];
					display.x=sx+(i+1)*(display.width)*sign[0];
					display.y=sy+(i+1)*(display.height)*sign[1];
				}
			}
			if(j<len){
				sInd++;
				current=j;
				total+=1;
				if(sInd==signs.length)sInd=0;
				rank();
			}
		}
	}
}
